package com.yztctech.a25_04_aidlclient;

import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.IBinder;
import android.os.RemoteException;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import com.yztctech.a25_04_aidlserver.ILoginListener;

/**
 * 为了实现跨进程通讯,我们开始使用aidl(android Interface Define Language);调用qq登陆,微信登录等三方登陆,以及三方支付功能,是不是就要用到这个东西呢
 * 1、 复制 Server 端的aidl 文件到工程中，注意路径(包名哦!)必须完全一致;(所以需要先写server端的代码),然后编译,在build下的aidl下生成java文件
 * 2、 在清单文件中添加和 Service 相对应的权限
 * 3、 使用 bindService（）的方式启动 Service;因为server端的代码用的是LoginServer的onBind()方法创建的MyBinder()来接收client端的信息
 *  - 所以会用到bindService(),ServiceConnection等
 * 4、 在 onServiceConnected（ComponentName name, IBinder service）方法中通过
 *       mLoginListener = ILoginListener.Stub.asInterface(service);获得接口实例,该方法是编译后自动生成的
 * 5. Android6.0以上 需要动态设置权限,静态设置的权限不够用,
 * 6. 通过bindService开启的服务,服务开启之后,调用者和服务之间 还存在着联系 ,一旦调用者挂掉了.service也会跟着挂掉 ,所以不用解绑
 */
public class MainActivity extends AppCompatActivity {

    private EditText nameEdt, pswEdt;

    private Button loginBtn;

    private ILoginListener loginListener;
	//建立service连接;观察者模式获取service下的binder持有
    private ServiceConnection sconn = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
            Log.e("Tag", "-----------> onServiceConnected");
            //通过AIDL，将Binder转换成交互的接口;获取
            loginListener = ILoginListener.Stub.asInterface(iBinder);
            //如果不是跨进程,跨包名的话应该这么写,LoginService.MyBinder extends ILoginListener.Stub呢,
//            loginListener = (LoginService.MyBinder)iBinder;
        }

        @Override
        public void onServiceDisconnected(ComponentName componentName) {

        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();//实例化控件

        //绑定Service ;通过action创建的intent就是隐式创建
        Intent intent = new Intent("android.intent.action.RESPOND_VIA_MESSAGE");
        intent.setPackage("com.yztctech.a25_04_aidlserver");//显示引用-----5.0以上必须使用显示引用;这种是隐式启动LoginService

        bindService(intent, sconn, Context.BIND_AUTO_CREATE);

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //解除绑定？？？？？？？ bindService不需要解绑
    }

    private void initView() {
        nameEdt = (EditText) findViewById(R.id.edt_name);
        pswEdt = (EditText) findViewById(R.id.edt_psw);
        loginBtn = (Button) findViewById(R.id.btn_login);
        loginBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String name = nameEdt.getEditableText().toString();
                String psw = pswEdt.getEditableText().toString();
                try {
                    boolean success =  loginListener.login(name, psw);
                    if (success) {
                        Toast.makeText(MainActivity.this, "登录成功", Toast.LENGTH_SHORT).show();
                    } else {
                        Toast.makeText(MainActivity.this, "登录失败", Toast.LENGTH_SHORT).show();
                    }
                } catch (RemoteException e) {
                    e.printStackTrace();
                }

            }
        });
    }
}
